/*
 * ComponenteGeneradoSimple.java	 
 *
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/10/10, 09:12:38 AM
 */

package com.ufps.cuatro.modelo.representacion.componente;

import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;

/**
 * <i><b>ComponenteGeneradoSimple:</b></i><p>Al Igual que la Clase <code>ComponenteGeneradoInterno</code>
 * Esta Clase permite generar representaciones simples de los Controles swing soportados en la Aplicación.</p>
 * <p>Sin embargo esta clase es utilizada para representaciones de Controles Libres
 * que son asociados a una representacion sin embargo aunque no dependen de la representación de un Tipo de Dato
 * si deben estar incluidos en un ComponenteGenerador.</p> 
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/10
 * @see ComponenteGenerado
 */
public class ComponenteGeneradoSimple extends ComponenteGenerado{
    private static final long serialVersionUID = 805475390121413396L;   
    
    private int idClaseComponenteGeneradoSimple;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGeneradoSimple;
    private boolean independiente;    
    
    /**
     * Contructor utilizado en la Implementación.
     * @param objComponenteBase Referencia al <code>ComponenteBaseStandar</code> que representa el Control.          
     * @param heredado Indica si el Componente es instanciado por Herencia.
     * @param previsualizar Indica si el Componente permite visualizaciones en la Aplicación.     
     * @param independiente Indica si la Representación esta asociada.
     */
    public ComponenteGeneradoSimple(ComponenteBaseStandar objComponenteBase, boolean heredado, boolean previsualizar, boolean independiente) {
        super(objComponenteBase, true, true);
        this.independiente = independiente;
        this.heredado = heredado;
        this.previsualizar = previsualizar;
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.generado.simple"); 
        if(!heredado){
            this.idClaseComponenteGeneradoSimple = (!previsualizar) ?
                    ComponenteGeneradoSimple.serialIdComponenteGeneradoSimple++ :
                    ComponenteGeneradoSimple.serialIdComponenteGeneradoSimple;        
        }
    }

    /**
     * Devuelve el Id de Generación del Componente Generado.
     * @return Id de Generación del Componente Generado.
     */
    public int getIdClaseComponenteGeneradoSimple() {
      try{
        return idClaseComponenteGeneradoSimple;
        }catch(java.lang.NullPointerException ex){}
      return 0;
    }          

    @Override
    public String toString() {
       try{
        if(this.eBiblioteca == TipoBiblioteca.eSwap) {
            return this.objClassSwing.getSimpleName() + "BS" + dni + this.idClaseComponenteGeneradoSimple;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
            return this.objClassSwing.getSimpleName() + "BL" + dni + this.idClaseComponenteGeneradoSimple;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
            return this.objClassSwing.getSimpleName() + "BG" + dni + this.idClaseComponenteGeneradoSimple;
        }
        else if(this.getObjPropiedadesDisponibles() != null){            
            //se evalua si la propiedad name ha sido inicializada
            if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                return this.getName();
            }
        }
        return this.objClassSwing.getSimpleName() + dni + this.idClaseComponenteGeneradoSimple;
    }catch(java.lang.NullPointerException ex){}
       return "";
    }

    /**
     * Indica si el Componente Generado es Independiente. El estado Independiente
     * se asume cuando el Componente Generado no hay sido creado junto al Componente
     * Parent (<code>Componente Extra</code>, <code>Componente Contenedor</code>) ó
     * <code>Componente Generador</code>, sino que ha sido agregado manualmente por
     * el usuario en el proceso de representación como apoyo en la creación de un
     * fragmento ó Interfaz Gráfica. La Independencia le da ciertas libertadees como
     * la Capacidad de no ser controlado directamente por su componete Parent por lo tanto
     * estado como Incluido no serán tomados en cuenta. Sin embargo es implica y delega
     * esa responsabilidad al Usuario.     
     * @return boolean que Indica si el Componente Generado es Independiente.
     */
    public boolean isIndependiente() {
        return independiente;
    }

    /**
     * Establece el Estado que Indica si el Componente Generado es Independiente. El estado Independiente
     * se asume cuando el Componente Generado no hay sido creado junto al Componente
     * Parent (<code>Componente Extra</code>, <code>Componente Contenedor</code>) ó
     * <code>Componente Generador</code>, sino que ha sido agregado manualmente por
     * el usuario en el proceso de representación como apoyo en la creación de un
     * fragmento ó Interfaz Gráfica. La Independencia le da ciertas libertadees como
     * la Capacidad de no ser controlado directamente por su componete Parent por lo tanto
     * estado como Incluido no serán tomados en cuenta. Sin embargo es implica y delega
     * esa responsabilidad al Usuario.     
     * @param independiente boolean que Indica si el Componente Generado es Independiente.
     */
    public void setIndependiente(boolean independiente) {
        this.independiente = independiente;
    }    

    @Override
    protected Object clone() {
       try{
            ComponenteGeneradoSimple objClon = null;
            //Primero se Clona la Referencia Local
            objClon = (ComponenteGeneradoSimple) super.clone();
            //Ahora se hace la Clonación Profunda        
            return objClon;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }

    @Override
    public int compareTo(Object o) {
      try{
        if(o instanceof ComponenteDistribuidor){
            return 1;
        }
        else{
            ComponenteGeneradoSimple obj = (ComponenteGeneradoSimple) o;
            if(this.idClaseComponenteGeneradoSimple > obj.idClaseComponenteGeneradoSimple) {
                return 1;
            }
            else if(this.idClaseComponenteGeneradoSimple < obj.idClaseComponenteGeneradoSimple) {
                return -1;
            }
            else {
                return 0;
            }
        }
    }catch(java.lang.NullPointerException ex){}
      return 0;
    }

    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGeneradoSimple = ComponenteGeneradoSimple.serialIdComponenteGeneradoSimple++;     
            this.previsualizar = false;
        }
    }

    @Override
    protected void actualizarGridBagConstraintsActiva() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
